home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-06-01 | 5.4 KB | 320 lines | [TEXT/MPS ] |
- #include "scanio.h"
- #include "scanner.h"
-
- #define CURSOR ch
- #define LOADCURSOR ch = *cursor;
- #define ADVANCE cursor++;
- #define BACK(n) cursor -= (n);
- #define CHECK(n) if((ScanCB.lim - cursor) < (n)){cursor = ScanFill(cursor);}
- #define MARK(n) ScanCB.ptr = cursor; sel = (n);
- #define REVERT cursor = ScanCB.ptr;
- #define MARKER sel
-
- #define RETURN(i) {ScanCB.cur = cursor; return i;}
-
- int ScanToken(){
- uchar *cursor = ScanCB.cur;
- unsigned sel;
- uchar ch;
- ScanCB.tok = cursor;
- ScanCB.eot = NULL;
- /*!re2c
- all = [\000-\377];
- eof = [\000];
- any = all\eof;
- letter = [a-z]|[A-Z];
- digit = [0-9];
- symchr = letter|digit|[.!?_];
- const = (digit|[.])symchr*([eE][+-]?digit+)?;
- simple = (symchr\(digit|[.]))(symchr\[.])*;
- stem = simple [.];
- symbol = symchr*;
- sqstr = ['] ((any\['\n])|(['][']))* ['];
- dqstr = ["] ((any\["\n])|(["]["]))* ["];
- str = sqstr|dqstr;
- ob = [ \t]*;
- not = [\\~];
- A = [aA];
- B = [bB];
- C = [cC];
- D = [dD];
- E = [eE];
- F = [fF];
- G = [gG];
- H = [hH];
- I = [iI];
- J = [jJ];
- K = [kK];
- L = [lL];
- M = [mM];
- N = [nN];
- O = [oO];
- P = [pP];
- Q = [qQ];
- R = [rR];
- S = [sS];
- T = [tT];
- U = [uU];
- V = [vV];
- W = [wW];
- X = [xX];
- Y = [yY];
- Z = [zZ];
- */
-
- scan:
- /*!re2c
- "\n"
- {
- ++(ScanCB.lineNum);
- ScanCB.linePos = ScanCB.pos + (cursor - ScanCB.mrk);
- RETURN(SU_EOL);
- }
- "|" ob "|"
- { RETURN(OP_CONCAT); }
- "+"
- { RETURN(OP_PLUS); }
- "-"
- { RETURN(OP_MINUS); }
- "*"
- { RETURN(OP_MULT); }
- "/"
- { RETURN(OP_DIV); }
- "%"
- { RETURN(OP_IDIV); }
- "/" ob "/"
- { RETURN(OP_REMAIN); }
- "*" ob "*"
- { RETURN(OP_POWER); }
- "="
- { RETURN(OP_EQUAL); }
- not ob "=" | "<" ob ">" | ">" ob "<"
- { RETURN(OP_EQUAL_N); }
- ">"
- { RETURN(OP_GT); }
- "<"
- { RETURN(OP_LT); }
- ">" ob "=" | not ob "<"
- { RETURN(OP_GE); }
- "<" ob "=" | not ob ">"
- { RETURN(OP_LE); }
- "=" ob "="
- { RETURN(OP_EQUAL_EQ); }
- not ob "=" ob "="
- { RETURN(OP_EQUAL_EQ_N); }
- ">" ob ">"
- { RETURN(OP_GT_STRICT); }
- "<" ob "<"
- { RETURN(OP_LT_STRICT); }
- ">" ob ">" ob "=" | not ob "<" ob "<"
- { RETURN(OP_GE_STRICT); }
- "<" ob "<" ob "=" | not ob ">" ob ">"
- { RETURN(OP_LE_STRICT); }
- "&"
- { RETURN(OP_AND); }
- "|"
- { RETURN(OP_OR); }
- "&" ob "&"
- { RETURN(OP_XOR); }
- not
- { RETURN(OP_NOT); }
-
- ":"
- { RETURN(SU_COLON); }
- ","
- { RETURN(SU_COMMA); }
- "("
- { RETURN(SU_POPEN); }
- ")"
- { RETURN(SU_PCLOSE); }
- ";"
- { RETURN(SU_EOC); }
-
- A D D R E S S
- { RETURN(RX_ADDRESS); }
- A R G
- { RETURN(RX_ARG); }
- C A L L
- { RETURN(RX_CALL); }
- D O
- { RETURN(RX_DO); }
- D R O P
- { RETURN(RX_DROP); }
- E L S E
- { RETURN(RX_ELSE); }
- E N D
- { RETURN(RX_END); }
- E X I T
- { RETURN(RX_EXIT); }
- I F
- { RETURN(RX_IF); }
- I N T E R P R E T
- { RETURN(RX_INTERPRET); }
- I T E R A T E
- { RETURN(RX_ITERATE); }
- L E A V E
- { RETURN(RX_LEAVE); }
- N O P
- { RETURN(RX_NOP); }
- N U M E R I C
- { RETURN(RX_NUMERIC); }
- O P T I O N S
- { RETURN(RX_OPTIONS); }
- O T H E R W I S E
- { RETURN(RX_OTHERWISE); }
- P A R S E
- { RETURN(RX_PARSE); }
- P R O C E D U R E
- { RETURN(RX_PROCEDURE); }
- P U L L
- { RETURN(RX_PULL); }
- P U S H
- { RETURN(RX_PUSH); }
- Q U E U E
- { RETURN(RX_QUEUE); }
- R E T U R N
- { RETURN(RX_RETURN); }
- S A Y
- { RETURN(RX_SAY); }
- S E L E C T
- { RETURN(RX_SELECT); }
- S I G N A L
- { RETURN(RX_SIGNAL); }
- T H E N
- { RETURN(RX_THEN); }
- T R A C E
- { RETURN(RX_TRACE); }
- W H E N
- { RETURN(RX_WHEN); }
- O F F
- { RETURN(RXS_OFF); }
- O N
- { RETURN(RXS_ON); }
- B Y
- { RETURN(RXS_BY); }
- D I G I T S
- { RETURN(RXS_DIGITS); }
- E N G I N E E R I N G
- { RETURN(RXS_ENGINEERING); }
- E R R O R
- { RETURN(RXS_ERROR); }
- E X P O S E
- { RETURN(RXS_EXPOSE); }
- F A I L U R E
- { RETURN(RXS_FAILURE); }
- F O R
- { RETURN(RXS_FOR); }
- F O R E V E R
- { RETURN(RXS_FOREVER); }
- F O R M
- { RETURN(RXS_FORM); }
- F U Z Z
- { RETURN(RXS_FUZZ); }
- H A L T
- { RETURN(RXS_HALT); }
- L I N E I N
- { RETURN(RXS_LINEIN); }
- N A M E
- { RETURN(RXS_NAME); }
- N O T R E A D Y
- { RETURN(RXS_NOTREADY); }
- N O V A L U E
- { RETURN(RXS_NOVALUE); }
- S C I E N T I F I C
- { RETURN(RXS_SCIENTIFIC); }
- S O U R C E
- { RETURN(RXS_SOURCE); }
- S Y N T A X
- { RETURN(RXS_SYNTAX); }
- T O
- { RETURN(RXS_TO); }
- U N T I L
- { RETURN(RXS_UNTIL); }
- U P P E R
- { RETURN(RXS_UPPER); }
- V A L U E
- { RETURN(RXS_VALUE); }
- V A R
- { RETURN(RXS_VAR); }
- V E R S I O N
- { RETURN(RXS_VERSION); }
- W H I L E
- { RETURN(RXS_WHILE); }
- W I T H
- { RETURN(RXS_WITH); }
-
- const
- { RETURN(SU_CONST); }
- simple
- { RETURN(SU_SYMBOL); }
- stem
- { RETURN(SU_SYMBOL_STEM); }
- symbol
- { RETURN(SU_SYMBOL_COMPOUND); }
- str
- { RETURN(SU_LITERAL); }
- str [bB] / (all\symchr)
- { RETURN(SU_LITERAL_BIN); }
- str [xX] / (all\symchr)
- { RETURN(SU_LITERAL_HEX); }
-
- eof
- { RETURN(SU_EOF); }
- any
- { RETURN(SU_ERROR); }
- */
- }
-
- bool StripToken(){
- uchar *cursor = ScanCB.cur;
- unsigned depth;
- uchar ch;
- bool blanks = FALSE;
- ScanCB.eot = cursor;
- strip:
- /*!re2c
- "/*"
- {
- depth = 1;
- goto comment;
- }
- "\r"
- { goto strip; }
- [ \t]
- {
- blanks = TRUE;
- goto strip;
- }
- [] / all
- { RETURN(blanks); }
- */
-
- comment:
- /*!re2c
- "*/"
- {
- if(--depth == 0)
- goto strip;
- else
- goto comment;
- }
- "\n"
- {
- ++(ScanCB.lineNum);
- ScanCB.linePos = ScanCB.pos + (cursor - ScanCB.mrk);
- goto comment;
- }
- "/*"
- {
- ++depth;
- goto comment;
- }
- eof
- { RETURN(blanks); }
- any
- {
- goto comment;
- }
- */
- }
-